home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / asip-status.nasl < prev    next >
Text File  |  2005-03-31  |  5KB  |  215 lines

  1. #
  2. # NASL script to send a DSIGetStatus / FPGetSrvrInfo to an AppleShare IP
  3. # server & parse the reply
  4. #
  5. # based off of http://www.jammed.com/~jwa/hacks/security/asip/asip-status
  6. #
  7. #
  8.  
  9. if (description)
  10. {
  11.       script_id(10666);
  12.      script_version ("$Revision: 1.11 $");
  13.     script_name(english: "AppleShare IP Server status query");
  14.     script_description(english: 
  15.     string("This script determines if a host is running AppleShare IP file services.\n",
  16.     "Risk factor : Medium"));
  17.  
  18.     script_summary(english: "connects to port 548/tcp, issues DSIGetStatus");
  19.     script_category(ACT_GATHER_INFO);
  20.     script_family(english: "Misc.", francais:"Divers");
  21.     script_copyright(english: "James W. Abendschan <jwa@jammed.com> (GPL)");
  22.     script_dependencie("find_service.nes");
  23.     script_require_ports(548);
  24.     exit(0);
  25. }
  26.  
  27. include("misc_func.inc");
  28.  
  29. function b2dw(a, b, c, d)
  30. {
  31.     a1 = a * 256 * 256 * 256;
  32.     b1 = b * 256 * 256;
  33.     c1 = c * 256;
  34.     dword = a1 + b1 + c1 + d;
  35.     return(dword);
  36. }
  37.  
  38. function b2w(low, high)    
  39. {
  40.     word = high * 256;
  41.     word = word + low;
  42.     return(word);
  43. }
  44.  
  45. # return a pascal string
  46.  
  47. function pstring(offset, packet)
  48. {
  49.     plen = ord(packet[offset]);
  50.     #display("offset: ", offset, "  length: ", plen, "\n");
  51.     pstr = "";    # avoid interpreter warning
  52.     for (i=1;i<plen+1;i=i+1)
  53.     {
  54.         pstr = pstr + packet[offset+i];
  55.     }
  56.     return (pstr);
  57. }
  58.  
  59. # pull out counted pstrings in packet starting at offset
  60.  
  61. function pluck_counted(offset, packet)
  62. {
  63.     count = ord(packet[offset]);
  64.     #display("plucking ", count, " items\n");
  65.     str = "";
  66.     plucked = "";
  67.     count_offset = offset + 1;
  68.     for (j=0;j<count;j=j+1)
  69.     {
  70.         str = pstring(offset:count_offset, packet:packet);
  71.         # offset + length of data + length byte
  72.         count_offset = count_offset + strlen(str) + 1;
  73.         plucked = plucked + str;
  74.         # lame coz there's no != ?
  75.         if (j < count-1)
  76.             plucked = plucked + "/";
  77.     }
  78.     return(plucked);
  79. }
  80.  
  81.  
  82. #
  83. # parse FPGetSrvrInfo reply (starting at DSIGetRequest reply packet + 16)
  84. #
  85.  
  86. function parse_FPGetSrvrInfo(packet)
  87. {
  88.         machinetype_offset = b2w(low:ord(packet[17]), high:ord(packet[16])) + 16;
  89.     machinetype = pstring(offset:machinetype_offset, packet:packet);
  90.  
  91.         afpversioncount_offset = b2w(low:ord(packet[19]), high:ord(packet[18])) + 16;
  92.     versions = pluck_counted(offset:afpversioncount_offset, packet:packet);
  93.  
  94.     uamcount_offset = b2w(low:ord(packet[21]), high:ord(packet[20])) + 16;
  95.     uams = pluck_counted(offset:uamcount_offset, packet:packet);
  96.  
  97.     servername = pstring(offset:26, packet:packet);
  98.  
  99.     report = string(
  100. "This host is running an AppleShare File Services over IP.\n",
  101. "  Machine type: ", machinetype, "\n",
  102. "  Server name: ", servername, "\n",
  103. "  UAMs: ", uams, "\n",
  104. "  AFP Versions: ", versions, "\n");
  105.  
  106.     #display(report);
  107.     security_note(port:548, data:report);
  108.     register_service(port:548, proto:"appleshare");
  109.  
  110.     if ("No User Authen" >< uams)
  111.     {
  112.         report = string( 
  113. "This AppleShare File Server allows the 'guest' user to connect.\n");
  114.         #display(report);
  115.         security_warning(port:548, data:report);
  116.     }    
  117. }
  118.  
  119.  
  120. #
  121. # parse ASIP reply packet
  122. #
  123.  
  124. function parse_DSIGetStatus(packet)
  125. {
  126.     flags = ord(packet[0]);
  127.     cmd = ord(packet[1]);
  128.     reqidL = ord(packet[2]);
  129.     reqidH = ord(packet[3]);
  130.  
  131.     reqid = b2w(low:reqidL, high:reqidH);
  132.  
  133.     if (!(reqid == 57005))
  134.     {
  135.         report = string(
  136. "Wrong signature in reply packet (got ", requid, " but expected 57005)\n"
  137.             );
  138.         security_note(port:548, data:report);
  139.         exit(1);
  140.     }
  141.  
  142.     # ignore error / data offset DO for now
  143.  
  144.     edo = b2dw(a:ord(packet[4]), b:ord(packet[5]), c:ord(packet[6]), d:ord(packet[7]));
  145.  
  146.     datalen = b2dw(a:ord(packet[8]), b:ord(packet[9]), c:ord(packet[10]), d:ord(packet[11]));
  147.  
  148.     reserved = b2dw(a:ord(packet[12]), b:ord(packet[13]), c:ord(packet[14]), d:ord(packet[15]));
  149.  
  150.     if (!(cmd == 3))
  151.     {
  152.         security_note(port:548, data:"error: can only handle a reply of type 3");
  153.         exit(1);
  154.     }
  155.  
  156.     return (parse_FPGetSrvrInfo(packet));
  157. }
  158.  
  159.  
  160. #
  161. # send the DSIGetStatus packet
  162. #
  163.  
  164. function send_DSIGetStatus(sock)
  165. {
  166.  
  167.     packet = raw_string
  168.         (
  169.         0x00,            # 0- request, 1-reply
  170.         0x03,            # 3- DSIGetStatus
  171.         0xad, 0xde, 0x00,    # request ID
  172.         0x00, 0x00, 0x00, 0x00,    # data field
  173.         0x00, 0x00, 0x00, 0x00,    # length of data stream header
  174.         0x00, 0x00, 0x00, 0x00    # reserved
  175.                 );
  176.  
  177.     send (socket:sock, data:packet);
  178.     buf = recv(socket:sock, length:8192, timeout:30);
  179.     if (strlen(buf) == 0)
  180.     {
  181.         exit(1);
  182.     }    
  183.     return(buf);
  184. }
  185.  
  186.  
  187. #
  188. # do it
  189. #
  190.  
  191. function asip_status(port)
  192. {
  193.     s = open_sock_tcp(port);
  194.     if (s)
  195.     {
  196.         packet = send_DSIGetStatus(sock:s);
  197.         if(strlen(packet) > 17)
  198.         {
  199.         parse_DSIGetStatus(packet:packet);
  200.         } 
  201.         close(sock);
  202.     }
  203. }
  204.  
  205.  
  206. #
  207. # main
  208. #
  209.  
  210. if (get_port_state(548))
  211. {
  212.     asip_status(port:548);
  213. }
  214.  
  215.